var fs = require('fs');

//base64 编码
function base64_encode(content){
    var buf = Buffer.from(content);
    var base64 = buf.toString('base64');

    return base64;
}
//base64 解码
function base64_decode(base64_str){
    var buf = Buffer.from(base64_str,'base64');
    return buf;
}

var base64_str = base64_encode([0xff,0xf1,0x11,0x12]);
console.log('将二进制数据编码为base64',base64_str);
var decode_buf = base64_decode(base64_str);
console.log('将base64解码为二进制数据',decode_buf);

// 二进制的图片，转为文本，传送， base64编码/解码
//读取文件
fs.readFile('icon1017.png',function(err,data){
    if(err){
        console.log('=err=');
        return;
    }

    var img_base64 = base64_encode(data);
    console.log('图片转为base64',img_base64);

    //将base64 图片数据转写入base64_img.png文件
    var img_data = base64_decode(img_base64);
    fs.writeFileSync("base64_img.png",img_data);
})

// ======================hash start==============================
// md5/sha1 哈希算法
/*
(1) 算法不逆, "Hello" --> hash --> '结果' -->反解hello, 密码,存在服务器上，都不是明码存储的。
"123456" --> 123456 数据库   --> md5哈希值,不知道什么意思。
(2) 每一个不同内容，它的Hash值是不同的。"123456", ---> MD5值, "123457" -->MD5值 唯一性
用途: 比较两个文件是否一样。预先计算好这个文件的md5的值，比较文件md5值来决定, 
密码等等。
*/
console.log('===============hash start====================')
var crypto = require("crypto");

//将任意数据转换为MD5
function md5(data){
    var md5 = crypto.createHash('md5');
    md5.update(data);
    return md5.digest('hex');
}

// b41c161c9b8d83e34201bd3f57b733ca
var str = md5("qidian");
console.log('字符串MD5 ==',str);

// e10adc3949ba59abbe56e057f20f883e
var str2 = md5("123456");
console.log('字符串MD5 ==',str2);

// 7f41aee075dd3cf075b73a2ebe806782
var data = fs.readFileSync("icon1017.png");
str = md5(data);
console.log("图片文件MD5 ==",str);

//7f41aee075dd3cf075b73a2ebe806782
var data = fs.readFileSync("base64_img.png");
str = md5(data);
console.log("图片文件MD5 ==",str);

data = fs.readFileSync("view.mp4");
str = md5(data)
console.log("视屏文件文件MD5 ==",str);


//将任意数据转换为MD5
function sha1(data){
    var sha1 = crypto.createHash('sha1');
    sha1.update(data);
    return sha1.digest('hex');
}

str = sha1("HelloWorld!");
console.log('字符串sha1 = ',str);
// ======================hash end==============================


fs.readFile("base64_img.png", function(err, data) {
	if (err) {
		return ;
	}

	console.log("begin setImmediate");
	// 等本次事件执行完成后，再来掉这里设置的回掉函数
	setImmediate(function() {
		console.log("yes setImmediate called");
	});

	console.log("end setImmediate");
 });

 // 每隔一段时间触发一次调用，可以传递回掉函数的参数,时间是毫秒
// 每隔300毫秒调用一次
// setInterval(function(data) {
// 	console.log("setInterval called: ", data);
// }, 3000, "Hello");

setTimeout(function(data) {
	console.log(data);
}, 3000, 12345);

var timer = setInterval(function(data) {
	console.log("setInterval called: ", data);
}, 3000, "Hello");

setTimeout(function(data) {
    console.log('====clearInterval====',data);
	clearInterval(timer);
}, 10000, 123456);